Date: Sat May 25 04:38:14 2019
Scientist: Ran Yin
Sequencing (Waksman): Dibyendu Kumar
Statistics: Davit Sargsyan
Principal Investigator: Ah-Ng Kong
# sink(file = "tmp/log_nrf2ubiome_data_visualization_may2019_v1.Rmd.txt")
# date()
options(scipen=999)
require(knitr)
Loading required package: knitr
require(kableExtra)
Loading required package: kableExtra
# # Increase mmemory size to 64 Gb----
# invisible(utils::memory.limit(65536))
options(stringsAsFactors = FALSE)
# str(knitr::opts_chunk$get())
# # NOTE: the below does not work!
# knitr::opts_chunk$set(echo = FALSE,
# message = FALSE,
# warning = FALSE,
# error = FALSE)
# On Windows set multithread=FALSE----
mt <- TRUE
require(data.table)
Loading required package: data.table
data.table 1.12.2 using 18 threads (see ?getDTthreads). Latest news: r-datatable.com
require(phyloseq)
Loading required package: phyloseq
require(ggplot2)
Loading required package: ggplot2
require(plotly)
Loading required package: plotly
Attaching package: ‘plotly’
The following object is masked from ‘package:ggplot2’:
last_plot
The following object is masked from ‘package:stats’:
filter
The following object is masked from ‘package:graphics’:
layout
# require(data.table)
require(DT)
Loading required package: DT
require(shiny)
Loading required package: shiny
Attaching package: ‘shiny’
The following objects are masked from ‘package:DT’:
dataTableOutput, renderDataTable
source("source/functions_may2019.R")
# Load data----
# Counts
load("data_may2019/ps_may2019.RData")
# Taxonomy
load("data_may2019/taxa.RData")
taxa <- data.table(seq16s = rownames(taxa),
taxa)
# Samples
samples <- ps_may2019@sam_data
DT::datatable(samples,
options = list(pageLength = nrow(samples)))
Taxonomic Ranks:
King Phillip Can nOt Find Green Socks
- Kingdom
- Phylum
- Class
- Order
- Family
- Genus
- Species
Prune data
Check mapping.
Bacteria Eukaryota <NA>
7994 116 19
Acidobacteria Actinobacteria Bacteroidetes Cyanobacteria Deferribacteres
3 177 2102 31 10
Epsilonbacteraeota Firmicutes Fusobacteria Parabasalia Patescibacteria
27 4997 1 1 63
Planctomycetes Proteobacteria Tenericutes Verrucomicrobia <NA>
1 202 84 66 364
First, all OTUs that were not bacteria were removed. Also, OTUs that were not mapped to a phylum were removed as these are usually sequencing artifacts.
Bacteria
7764
Acidobacteria Actinobacteria Bacteroidetes Cyanobacteria Deferribacteres
3 177 2102 31 10
Epsilonbacteraeota Firmicutes Fusobacteria Patescibacteria Planctomycetes
27 4997 1 63 1
Proteobacteria Tenericutes Verrucomicrobia
202 84 66
Richness (Alpha diversity)
Total counts per sample (i.e. sequencing depth)
Relative abundance (%) at Phylum level
Remove phyla with relative abundance of >= 1% in less than 10% of samples (i.e. prevalence >= 10%).
Hence, only 6 out of 13 Phyla were studied in this analysis: Actinobacteria, Bacteroidetes, Firmicutes, Proteobacteria, Tenericutes and Verrucomicrobia. Relative abundance at the next taxonomic level (Class) was, therefore, computed relative to the sum of these 6 Phyla.
[1] "Actinobacteria" "Bacteroidetes" "Firmicutes" "Proteobacteria" "Tenericutes"
[6] "Verrucomicrobia"
7,628 OTUs, down from 7,764 OTUs in the previous table.
Relative Abundance in Samples at Different Taxonomic Ranks
LS0tCnRpdGxlOiAiTnJmMiBCTDYgUEVJVEMgMTZTIE1pY3JvYmlvbWUgRGF0YSBWaXN1YWxpemF0aW9uIgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCkRhdGU6IGByIGRhdGUoKWAgICAgIApTY2llbnRpc3Q6IFtSYW4gWWluXShtYWlsdG86cnkxNDdAc2NhcmxldG1haWwucnV0Z2Vycy5lZHUpICAgICAgClNlcXVlbmNpbmcgKFdha3NtYW4pOiBbRGlieWVuZHUgS3VtYXJdKG1haWx0bzpka0B3YWtzbWFuLnJ1dGdlcnMuZWR1KSAgICAgIApTdGF0aXN0aWNzOiBbRGF2aXQgU2FyZ3N5YW5dKG1haWx0bzpzYXJnZGF2aWRAZ21haWwuY29tKSAgICAgIApQcmluY2lwYWwgSW52ZXN0aWdhdG9yOiBbQWgtTmcgS29uZ10obWFpbHRvOmtvbmd0QHBoYXJtYWN5LnJ1dGdlcnMuZWR1KSAKCmBgYHtyIGhlYWRlcn0KIyBzaW5rKGZpbGUgPSAidG1wL2xvZ19ucmYydWJpb21lX2RhdGFfdmlzdWFsaXphdGlvbl9tYXkyMDE5X3YxLlJtZC50eHQiKQojIGRhdGUoKQpvcHRpb25zKHNjaXBlbj05OTkpCgpyZXF1aXJlKGtuaXRyKQpyZXF1aXJlKGthYmxlRXh0cmEpCgojICMgSW5jcmVhc2UgbW1lbW9yeSBzaXplIHRvIDY0IEdiLS0tLQojIGludmlzaWJsZSh1dGlsczo6bWVtb3J5LmxpbWl0KDY1NTM2KSkKb3B0aW9ucyhzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiMgc3RyKGtuaXRyOjpvcHRzX2NodW5rJGdldCgpKQojICMgTk9URTogdGhlIGJlbG93IGRvZXMgbm90IHdvcmshCiMga25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgCiMgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwKIyAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLAojICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IEZBTFNFKQoKIyBPbiBXaW5kb3dzIHNldCBtdWx0aXRocmVhZD1GQUxTRS0tLS0KbXQgPC0gVFJVRQoKcmVxdWlyZShkYXRhLnRhYmxlKQpyZXF1aXJlKHBoeWxvc2VxKQpyZXF1aXJlKGdncGxvdDIpCnJlcXVpcmUocGxvdGx5KQojIHJlcXVpcmUoZGF0YS50YWJsZSkKcmVxdWlyZShEVCkKcmVxdWlyZShzaGlueSkKc291cmNlKCJzb3VyY2UvZnVuY3Rpb25zX21heTIwMTkuUiIpCgojIExvYWQgZGF0YS0tLS0KIyBDb3VudHMKbG9hZCgiZGF0YV9tYXkyMDE5L3BzX21heTIwMTkuUkRhdGEiKQoKIyBUYXhvbm9teQpsb2FkKCJkYXRhX21heTIwMTkvdGF4YS5SRGF0YSIpCnRheGEgPC0gZGF0YS50YWJsZShzZXExNnMgPSByb3duYW1lcyh0YXhhKSwKICAgICAgICAgICAgICAgICAgIHRheGEpCgojIFNhbXBsZXMKc2FtcGxlcyA8LSBwc19tYXkyMDE5QHNhbV9kYXRhCkRUOjpkYXRhdGFibGUoc2FtcGxlcywKICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gbnJvdyhzYW1wbGVzKSkpCmBgYAoKIyMjIFRheG9ub21pYyBSYW5rczoKIyMjIyAqKksqKmluZyAqKlAqKmhpbGxpcCAqKkMqKmFuIG4qKk8qKnQgKipGKippbmQgKipHKipyZWVuICoqUyoqb2NrcwoqIEtpbmdkb20gICAgICAgICAgICAgICAgCiogUGh5bHVtICAgICAgICAgICAgICAgICAgICAKKiBDbGFzcyAgICAgICAgICAgICAgICAgICAKKiBPcmRlciAgICAgICAgICAgICAgICAgICAKKiBGYW1pbHkgICAgIAoqIEdlbnVzICAgICAKKiBTcGVjaWVzICAKCiMgUHJ1bmUgZGF0YQpDaGVjayBtYXBwaW5nLgpgYGB7ciBjaGVja19tYXBwaW5nLCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRX0KdGFibGUodGF4X3RhYmxlKHBzX21heTIwMTkpWywgIktpbmdkb20iXSwgCiAgICAgIGV4Y2x1ZGUgPSBOVUxMKQp0YWJsZSh0YXhfdGFibGUocHNfbWF5MjAxOSlbLCAiUGh5bHVtIl0sIAogICAgICBleGNsdWRlID0gTlVMTCkKYGBgCgpGaXJzdCwgYWxsIE9UVXMgdGhhdCB3ZXJlIG5vdCBiYWN0ZXJpYSB3ZXJlIHJlbW92ZWQuIEFsc28sIE9UVXMgdGhhdCB3ZXJlIG5vdCBtYXBwZWQgdG8gYSBwaHlsdW0gd2VyZSByZW1vdmVkIGFzIHRoZXNlIGFyZSAgdXN1YWxseSBzZXF1ZW5jaW5nIGFydGlmYWN0cy4KYGBge3IgcHJ1bmUsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFfQojIDEuIEtlZXAgYmFjdGVyaWEgb25seSAoaS5lLiByZW1vdmUgYXJjaGVhIGFuZCBldWNhcnlvdGEpCiMgMi4gUmVtb3ZlIGlmIHBoeWx1bSBpcyB1bm1hcHBlZApwczAgPC0gc3Vic2V0X3RheGEocHNfbWF5MjAxOSwgCiAgICAgICAgICAgICAgICAgICBLaW5nZG9tID09ICJCYWN0ZXJpYSIgJgogICAgICAgICAgICAgICAgICAgICAhaXMubmEoUGh5bHVtKSkKCnRhYmxlKHRheF90YWJsZShwczApWywgIktpbmdkb20iXSwgCiAgICAgIGV4Y2x1ZGUgPSBOVUxMKQp0YWJsZSh0YXhfdGFibGUocHMwKVssICJQaHlsdW0iXSwgCiAgICAgIGV4Y2x1ZGUgPSBOVUxMKQpgYGAKCiMgUmljaG5lc3MgKEFscGhhIGRpdmVyc2l0eSkKYGBge3IgcmljaG5lc3MsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTV9CnBzMEBzYW1fZGF0YSREaWV0X1dlZWsgPC0gcGFzdGUoc2FtcGxlcyRUUkVBVE1FTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMkV0VFSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwID0gIl8iKQpwczBAc2FtX2RhdGEkSUQgPC0gc3Vic3RyKHggPSBwczBAc2FtX2RhdGEkU0FNUExFX05BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IDMpCnAxIDwtIHBsb3RfcmljaG5lc3MocHMwLAogICAgICAgICAgICAgICAgICAgIHggPSAiRGlldF9XZWVrIiwgCiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXMgPSAiU2hhbm5vbiIsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiSUQiKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IElEKSwKICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siKSArCiAgZ2VvbV9wb2ludChzaGFwZSA9IDIxLAogICAgICAgICAgICAgc2l6ZSA9IDMsCiAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpCmdncGxvdGx5KHAxKQpgYGAKCiMgT1RVIHRhYmxlCmBgYHtyIG90dV90YWJsZSwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0V9Cm90dSA8LSBkYXRhLnRhYmxlKHBzMEB0YXhfdGFibGVALkRhdGEsCiAgICAgICAgICAgICAgICAgIHQocHMwQG90dV90YWJsZUAuRGF0YSkpCkRUOjpkYXRhdGFibGUob3R1KQpgYGAKCiMgVG90YWwgY291bnRzIHBlciBzYW1wbGUgKGkuZS4gc2VxdWVuY2luZyBkZXB0aCkKYGBge3IgVGF4LCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSxmaWcud2lkdGg9MTAsZmlnLmhlaWdodD01fQp0MSA8LSBjb2xTdW1zKG90dVssIDc6bmNvbChvdHUpXSkKdDEgPC0gZGF0YS50YWJsZShTQU1QTEVfTkFNRSA9IG5hbWVzKHQxKSwKICAgICAgICAgICAgICAgICBUb3RhbCA9IHQxKQoKdG1wIDwtIGRhdGEudGFibGUoU0FNUExFX05BTUUgPSBzYW1wbGVzJFNBTVBMRV9OQU1FLAogICAgICAgICAgICAgICAgICBUUkVBVE1FTlQgPSBzYW1wbGVzJFRSRUFUTUVOVCwKICAgICAgICAgICAgICAgICAgV0VFSyA9IHNhbXBsZXMkV0VFSykKCnQxIDwtIG1lcmdlKHRtcCwKICAgICAgICAgICAgdDEsCiAgICAgICAgICAgIGJ5ID0gIlNBTVBMRV9OQU1FIikKCnAxIDwtIGdncGxvdCh0MSwKICAgICAgICAgICAgIGFlcyh4ID0gU0FNUExFX05BTUUsCiAgICAgICAgICAgICAgICAgeSA9IFRvdGFsLAogICAgICAgICAgICAgICAgIGZpbGwgPSBUUkVBVE1FTlQsCiAgICAgICAgICAgICAgICAgY29sb3VyID0gV0VFSykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogIHNjYWxlX3hfZGlzY3JldGUoIlNhbXBsZSBOYW1lIikgKwogIHNjYWxlX3lfY29udGludW91cygiTnVtYmVyIG9mIFJlYWRzIikgKwogIHNjYWxlX2ZpbGxfZGlzY3JldGUoIkdyb3VwIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxKSkgCmdncGxvdGx5KHAxKQpgYGAKCiMgQ291bnRzIGF0IFBoeWx1bSBsZXZlbApgYGB7ciBjb3VudHNfcCwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CmNvdW50c19wIDwtIGNvdW50c19ieV90YXhfcmFuayhkdDEgPSBvdHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyX2J5ID0gIlBoeWx1bSIpCkRUOjpkYXRhdGFibGUoY291bnRzX3AsCiAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IG5yb3coY291bnRzX3ApKSkKYGBgCgojIFJlbGF0aXZlIGFidW5kYW5jZSAoJSkgYXQgUGh5bHVtIGxldmVsCmBgYHtyIHJhX3AsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFfQpyYV9wIDwtIHJhX2J5X3RheF9yYW5rKGNvdW50cyA9IGNvdW50c19wKQpEVDo6ZGF0YXRhYmxlKHJhX3AsCiAgICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IG5yb3cocmFfcCkpKQpgYGAKClJlbW92ZSBwaHlsYSB3aXRoIHJlbGF0aXZlIGFidW5kYW5jZSBvZiA+PSAxJSBpbiBsZXNzIHRoYW4gMTAlIG9mIHNhbXBsZXMgKGkuZS4gcHJldmFsZW5jZSA+PSAxMCUpLgoKYGBge3IgcHJldl9wLCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRX0KdDEgPC0gZGF0YS50YWJsZShQaHlsdW0gPSByYV9wJFBoeWx1bSwKICAgICAgICAgICAgICAgICBQcmV2YWxlbmNlID0gcm91bmQoMTAwKnJvd1N1bXMocmFfcFssIDI6bmNvbChyYV9wKV0gPj0gMSkvMzAsIDEpKQpEVDo6ZGF0YXRhYmxlKHQxLAogICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSBucm93KHJhX3ApKSkKYGBgCgpIZW5jZSwgb25seSA2IG91dCBvZiAxMyBQaHlsYSB3ZXJlIHN0dWRpZWQgaW4gdGhpcyBhbmFseXNpczogQWN0aW5vYmFjdGVyaWEsIEJhY3Rlcm9pZGV0ZXMsIEZpcm1pY3V0ZXMsIFByb3Rlb2JhY3RlcmlhLCBUZW5lcmljdXRlcyBhbmQgVmVycnVjb21pY3JvYmlhLiBSZWxhdGl2ZSBhYnVuZGFuY2UgYXQgdGhlIG5leHQgdGF4b25vbWljIGxldmVsIChDbGFzcykgd2FzLCB0aGVyZWZvcmUsIGNvbXB1dGVkIHJlbGF0aXZlIHRvIHRoZSBzdW0gb2YgdGhlc2UgNiBQaHlsYS4KCmBgYHtyIGtlZXBfNl9waHlsYSwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0V9CmtlZXBfcCA8LSB0MSRQaHlsdW1bdDEkUHJldmFsZW5jZSA+PSAxMF0Ka2VlcF9wIApwczEgPC0gc3Vic2V0X3RheGEocHMwLCAKICAgICAgICAgICAgICAgICAgIFBoeWx1bSAlaW4lIGtlZXBfcCApCm90dTEgPC0gZGF0YS50YWJsZShwczFAdGF4X3RhYmxlQC5EYXRhLAogICAgICAgICAgICAgICAgICAgdChwczFAb3R1X3RhYmxlQC5EYXRhKSkKRFQ6OmRhdGF0YWJsZShvdHUxKQpgYGAKCjcsNjI4IE9UVXMsIGRvd24gZnJvbSA3LDc2NCBPVFVzIGluIHRoZSBwcmV2aW91cyB0YWJsZS4KCgojIFJlbGF0aXZlIEFidW5kYW5jZSBpbiBTYW1wbGVzIGF0IERpZmZlcmVudCBUYXhvbm9taWMgUmFua3MKIyMgMS4gQ2xhc3MKYGBge3IgY291bnRzX2MsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLGZpZy53aWR0aD0xMCxmaWcuaGVpZ2h0PTZ9CmNvdW50c19jIDwtIGNvdW50c19ieV90YXhfcmFuayhkdDEgPSBvdHUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncl9ieSA9ICJDbGFzcyIpCnJhX2MgPC0gcmFfYnlfdGF4X3JhbmsoY291bnRzX2MpCgp0YXgucmFua3MgPC0gdW5pcXVlKG90dTFbLCBjKCJQaHlsdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGFzcyIpXSkKCnJhX2MgPC0gbWVyZ2UodGF4LnJhbmtzLAogICAgICAgICAgICAgIHJhX2MsCiAgICAgICAgICAgICAgYnkgPSAiQ2xhc3MiKQoKdG90YWwgPC0gcm93U3VtcyhyYV9jWywgMzpuY29sKHJhX2MpXSkKCnJhX2MkQ2xhc3MgPC0gZmFjdG9yKHJhX2MkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHJhX2MkQ2xhc3Nbb3JkZXIodG90YWwpXSkKCnJhX2MkUGh5bHVtIDwtIGZhY3RvcihyYV9jJFBoeWx1bSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IHVuaXF1ZShyYV9jJFBoeWx1bVtvcmRlcih0b3RhbCldKSkKdG1wIDwtIG1lbHQuZGF0YS50YWJsZShkYXRhID0gcmFfYywKICAgICAgICAgICAgICAgICAgICAgICBpZC52YXJzID0gMToyLAogICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmUudmFycyA9IDM6bmNvbChjb3VudHNfYyksCiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJTQU1QTEVfTkFNRSIsCiAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUubmFtZSA9ICJSQSIpCgp0bXAgPC0gbWVyZ2UoZGF0YS50YWJsZShTQU1QTEVfTkFNRSA9IHNhbXBsZXMkU0FNUExFX05BTUUsCiAgICAgICAgICAgICAgICAgICAgICAgIFdFRUsgPSBzYW1wbGVzJFdFRUssCiAgICAgICAgICAgICAgICAgICAgICAgIFRSRUFUTUVOVCA9IHNhbXBsZXMkVFJFQVRNRU5UKSwKICAgICAgICAgICAgIHRtcCwKICAgICAgICAgICAgIGJ5ID0gIlNBTVBMRV9OQU1FIikKCiMgUGxvdCBzYW1wbGVzCnAxIDwtIGdncGxvdCh0bXAsCiAgICAgICAgICAgICBhZXMoeCA9IFNBTVBMRV9OQU1FLAogICAgICAgICAgICAgICAgIHkgPSBSQSwKICAgICAgICAgICAgICAgICBmaWxsID0gQ2xhc3MsCiAgICAgICAgICAgICAgICAgY29sb3IgPSBQaHlsdW0pKSArCiAgZmFjZXRfd3JhcCh+IFdFRUsgKyBUUkVBVE1FTlQsCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV94IiwKICAgICAgICAgICAgIG5yb3cgPSAzKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBzY2FsZV94X2Rpc2NyZXRlKCIiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAxKSkKZ2dwbG90bHkocDEpCmBgYAojIFNlc3Npb24gSW5mb3JtYXRpb24KYGBge3IgaW5mbyxldmFsPVRSVUV9CnNlc3Npb25JbmZvKCkKYGBg